البرمجة

وظائف المصفوفات في جافا سكريبت

كيفية استخدام وظائف المصفوفات في جافا سكريبت – توابع الوصول

تُعتبر المصفوفات Arrays في جافا سكريبت من أهم الهياكل البيانية المستخدمة لتخزين مجموعة من القيم أو العناصر، وتتمتع جافا سكريبت بمجموعة كبيرة وغنية من الوظائف والطرق Methods التي تُتيح التفاعل مع المصفوفات بكفاءة عالية. ومن بين هذه الوظائف، توابع الوصول أو توابع القراءة التي تُستخدم لاسترجاع بيانات معينة من المصفوفة، مثل العناصر الفردية أو أجزاء منها أو خصائص معينة.

في هذا المقال سنتناول بشكل موسع ودقيق وظائف المصفوفات في جافا سكريبت، مع التركيز على توابع الوصول، لتقديم فهم شامل يمكن الاعتماد عليه في مشاريع البرمجة الحديثة.


مفهوم المصفوفة في جافا سكريبت

المصفوفة هي بنية بيانات تسمح بتخزين مجموعة من القيم المرتبة، كل قيمة تُسمى عنصرًا داخل المصفوفة، ويمكن الوصول إلى كل عنصر عن طريق فهرس رقمي يبدأ من الصفر. تحتوي جافا سكريبت على مصفوفات مرنة يمكنها استيعاب أنواع بيانات مختلفة، مثل الأعداد، النصوص، الكائنات، وحتى مصفوفات أخرى.

مثال بسيط لإنشاء مصفوفة:

javascript
let fruits = ["تفاح", "موز", "برتقال"];

يمكن الوصول إلى العناصر عن طريق:

javascript
console.log(fruits[0]); // "تفاح"

توابع الوصول في المصفوفات

توابع الوصول في جافا سكريبت هي الوظائف التي تسمح باسترجاع قيم أو أجزاء من المصفوفة دون تعديلها. هذه التوابع تُستخدم في معظم الأحيان لتحليل البيانات، قراءة العناصر، أو نسخ أجزاء من المصفوفة.

1. دالة length

هي خاصية وليست دالة فعلية، وتُستخدم لمعرفة عدد العناصر في المصفوفة.

javascript
let numbers = [10, 20, 30, 40]; console.log(numbers.length); // 4

تعتبر length نقطة البداية لمعظم عمليات التكرار على المصفوفات.


2. تابع slice()

يُستخدم لاستخراج جزء من المصفوفة بين مؤشرين محددين دون تعديل المصفوفة الأصلية. يعيد مصفوفة جديدة تحتوي على العناصر التي تم استخراجها.

javascript
let letters = ['أ', 'ب', 'ت', 'ث', 'ج']; let subset = letters.slice(1, 4); console.log(subset); // ['ب', 'ت', 'ث'] console.log(letters); // ['أ', 'ب', 'ت', 'ث', 'ج'] الأصلية دون تغيير
  • يبدأ الاستخراج من المؤشر الأول (شامل).

  • ينتهي عند المؤشر الثاني (غير شامل).

  • إذا لم يُحدد المؤشر الثاني، يتم الاستخراج حتى نهاية المصفوفة.


3. تابع concat()

يُستخدم لدمج مصفوفتين أو أكثر في مصفوفة جديدة، دون تعديل المصفوفات الأصلية.

javascript
let array1 = [1, 2]; let array2 = [3, 4]; let combined = array1.concat(array2); console.log(combined); // [1, 2, 3, 4]
  • يعيد نسخة جديدة.

  • يمكن دمج أكثر من مصفوفة في نفس الوقت.


4. تابع indexOf()

يبحث عن عنصر معين داخل المصفوفة ويُرجع موقع أول ظهور له. إذا لم يتم العثور عليه يعيد القيمة -1.

javascript
let colors = ['أحمر', 'أزرق', 'أخضر']; console.log(colors.indexOf('أزرق')); // 1 console.log(colors.indexOf('أسود')); // -1
  • يمكن استخدامه لتحديد وجود عنصر معين.

  • البحث يكون من بداية المصفوفة.


5. تابع lastIndexOf()

يشبه indexOf() لكنه يبحث من نهاية المصفوفة نحو بدايتها ويعيد موقع آخر ظهور للعنصر.

javascript
let numbers = [1, 2, 3, 2, 4]; console.log(numbers.lastIndexOf(2)); // 3

6. تابع find()

يبحث في المصفوفة عن أول عنصر يُحقق شرطًا معينًا مُحددًا من خلال دالة، ويُعيد هذا العنصر. إذا لم يجد أي عنصر يطابق الشرط، يعيد undefined.

javascript
let users = [ {name: "علي", age: 25}, {name: "سارة", age: 30}, {name: "محمد", age: 20} ]; let user = users.find(u => u.age > 22); console.log(user); // {name: "علي", age: 25}

7. تابع findIndex()

يشبه find() لكنه يعيد موقع العنصر بدلاً من قيمته.

javascript
let index = users.findIndex(u => u.age > 22); console.log(index); // 0

8. تابع includes()

يرجع true أو false بناءً على وجود عنصر معين في المصفوفة.

javascript
let pets = ['قط', 'كلب', 'سمكة']; console.log(pets.includes('كلب')); // true console.log(pets.includes('عصفور')); // false

9. تابع join()

يحول جميع عناصر المصفوفة إلى نص واحد، ويُدرج بين كل عنصر والآخر قيمة محددة (افتراضيًا فاصلة).

javascript
let words = ['أنا', 'أحب', 'الجافا سكريبت']; let sentence = words.join(' '); console.log(sentence); // "أنا أحب الجافا سكريبت"

10. تابع toString()

يشبه join() لكنه يُحول المصفوفة إلى سلسلة نصية مفصولة بفواصل.

javascript
let nums = [1, 2, 3]; console.log(nums.toString()); // "1,2,3"

توابع الوصول في المصفوفات متعددة الأغراض

إلى جانب التوابع السابقة التي تُستخدم لقراءة عناصر أو أجزاء من المصفوفة، توجد توابع أخرى تُستخدم للوصول بطريقة أكثر ديناميكية وتحليلية:

تابع map()

يقوم بتطبيق دالة على كل عنصر من عناصر المصفوفة وينتج مصفوفة جديدة بالعناصر بعد تطبيق الدالة.

javascript
let numbers = [1, 2, 3]; let squares = numbers.map(x => x * x); console.log(squares); // [1, 4, 9]

تابع filter()

يُستخدم لاستخراج عناصر تحقق شرطًا معينًا، ويُعيد مصفوفة جديدة بالعناصر التي تحقق الشرط.

javascript
let ages = [12, 18, 22, 15]; let adults = ages.filter(age => age >= 18); console.log(adults); // [18, 22]

تابع reduce()

يُستخدم لتجميع قيم المصفوفة أو تحويلها إلى قيمة واحدة باستخدام دالة تجمعية.

javascript
let nums = [1, 2, 3, 4]; let sum = nums.reduce((acc, curr) => acc + curr, 0); console.log(sum); // 10

التعامل مع المصفوفات متعددة الأبعاد

يمكن أيضًا استخدام توابع الوصول مع المصفوفات متعددة الأبعاد (أي مصفوفات تحتوي على مصفوفات أخرى).

مثال:

javascript
let matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; console.log(matrix[1][2]); // 6

مقارنة بين توابع الوصول وتوابع التعديل

من المهم أن نفهم أن توابع الوصول لا تقوم بتغيير المصفوفة الأصلية (ما عدا في حالات خاصة)، بل تُعيد نسخة أو قيمة معينة منها. أما توابع التعديل (مثل push(), pop(), splice()) فهي التي تغير محتوى المصفوفة.

استخدام توابع الوصول يحافظ على سلامة البيانات ويُسهل عمليات القراءة والتحليل دون خطر التغيير غير المقصود.


جدول مقارنة لبعض توابع الوصول الشائعة في المصفوفات

التابع وصف الوظيفة النتيجة تعديل المصفوفة الأصلية؟
length عدد عناصر المصفوفة عدد صحيح لا
slice(start, end) استخراج جزء من المصفوفة مصفوفة جديدة لا
concat(arr) دمج مصفوفتين أو أكثر مصفوفة جديدة لا
indexOf(value) البحث عن أول ظهور لقيمة رقم الموقع أو -1 إذا لم توجد لا
lastIndexOf(value) البحث عن آخر ظهور لقيمة رقم الموقع أو -1 إذا لم توجد لا
find(callback) إيجاد أول عنصر يحقق شرطًا معينًا العنصر نفسه أو undefined لا
findIndex(callback) إيجاد موقع أول عنصر يحقق شرطًا رقم الموقع أو -1 إذا لم توجد لا
includes(value) التحقق من وجود قيمة true أو false لا
join(separator) دمج كل العناصر في نص باستخدام فاصل معين نص لا
toString() تحويل المصفوفة إلى نص بفواصل نص لا

أهمية توابع الوصول في تطوير البرمجيات

توابع الوصول تلعب دورًا حيويًا في التعامل مع البيانات المخزنة داخل المصفوفات، فهي توفر أدوات مرنة لاسترجاع وتحليل البيانات بدون تعقيد أو الحاجة إلى كتابة حلقات يدوية معقدة في أغلب الأحيان.

كما تُمكن المطورين من كتابة شفرات نظيفة، سهلة القراءة، وأقل عرضة للأخطاء، إضافة إلى تحسين الأداء في كثير من الحالات بفضل طبيعة جافا سكريبت المتمكنة من التعامل مع هذه الوظائف بشكل داخلي بكفاءة.


ممارسات جيدة عند استخدام توابع المصفوفات

  • تجنب تعديل المصفوفة الأصلية عند عدم الحاجة: يفضل استخدام توابع الوصول التي لا تعدل المصفوفة الأصلية للحفاظ على البيانات الأساسية.

  • استخدام أسماء واضحة للدوال والكائنات: عند استخدام دوال مثل find أو filter يُفضل كتابة تعبيرات واضحة تعبر عن شرط البحث.

  • الاستفادة من التكرار الداخلي: توابع مثل map وfilter تحل محل الحلقات التقليدية بعبارات أبسط وأكثر وضوحًا.

  • مراعاة الأداء عند العمل مع مصفوفات كبيرة: بعض التوابع مثل reduce وfind قد تتطلب المرور على كل العناصر، لذا يجب اختيار الطريقة الأنسب حسب الحاجة.


الخلاصة

توابع الوصول في المصفوفات بجافا سكريبت تشكل مجموعة قوية ومرنة من الوظائف التي تسهل استخراج وتحليل البيانات بطريقة منظمة وأنيقة، مع ضمان الحفاظ على سلامة البيانات الأصلية وعدم تعديلها عند القراءة. المعرفة المتعمقة بهذه التوابع تمكن المطور من كتابة برامج أكثر كفاءة ووضوحًا، وتفتح آفاقًا واسعة للتعامل مع البيانات بكافة أشكالها داخل التطبيقات الحديثة.


المصادر والمراجع

  1. MDN Web Docs – Array – https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

  2. كتاب JavaScript: The Definitive Guide, 7th Edition, David Flanagan


بهذا تكون الصورة واضحة وشاملة حول كيفية استخدام وظائف المصفوفات في جافا سكريبت مع التركيز على توابع الوصول التي تتيح قراءة واسترجاع البيانات بطريقة فعالة ومنظمة.